package entity.test01.demo01;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class BeanUtil {
    /**
     * 实例化任意类型的对象
     *
     * @param className 包名.类名
     * @return 任意对象
     */
    public static Object createBean(String className) {
        // 1.获取 Student 类的 Class 对象
        try {
            Class<?> clazz = Class
                    .forName(className);
            // 在反射中，把类的相关信息封装为相关的对象
            // 2.通过 Class 对象，获取类的构造方法对象
            Constructor<?> constructor = clazz.getConstructor();

            // 3.实例化对象
            return constructor.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 调用指定的方法
     *
     * @param className  包名.类名
     * @param methodName 方法名
     * @param paramType  方法参数的Class对象
     * @param paramValue 方法参数的实参列表
     * @return 调用方法返回值
     */
    public static Object invokeMethod(String className, String methodName, Class<?>[] paramType, Object... paramValue) {

        try {
            Class<?> clazz = Class
                    .forName(className);

            // 4.通过 Class 对象，获取要调用的方法
            // 语法：getMethod("方法名",方法参数的 Class 对象,...)
            Method method = clazz
                    .getMethod(methodName, paramType);

            // 5.调用方法 - 对象.xxx() ;
            // 在 Method 对象中，提供了 invoke 方法，调用 Method 对象指向的方法
            // 语法：[Object obj = ]invoke("对象名称",实参列表,...)
            return method.invoke(createBean(className), paramValue);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
